package com.linyaonan.leetcode.sword_to_offer._58;

/**
 * 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如，输入字符串"abcdefg"和数字2，该函数将返回左旋转两位得到的结果"cdefgab"。
 *
 *  
 *
 * 示例 1：
 *
 * 输入: s = "abcdefg", k = 2
 * 输出: "cdefgab"
 * 示例 2：
 *
 * 输入: s = "lrloseumgh", k = 6
 * 输出: "umghlrlose"
 *  
 *
 * 限制：
 *
 * 1 <= k < s.length <= 10000
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * 简单做法就直接使用StringBuilder拼接，但是极端情况下，s特别长，n=1的情况下就显得不那么优雅
 *
 * 所以参考subStr的实现借助 System.arraycopy 来实现
 *
 */
class Solution {
    public String reverseLeftWords(String s, int n) {
        if (s == null || s.equals("")) {
            return s;
        }
        StringBuilder sb = new StringBuilder();
        char[] chars = s.toCharArray();
        for (int i = n; i < chars.length; i++) {
            sb.append(chars[i]);
        }
        for (int i = 0; i < n; i++) {
            sb.append(chars[i]);
        }
        return sb.toString();
    }

    public String r1(String s, int n) {
        if (s == null || s.equals("")) {
            return s;
        }
        byte[] bb = s.getBytes();
        int l = s.length();
        byte[] bytes = new byte[s.length()];
        System.arraycopy(bb, n, bytes, 0, l - n);
        System.arraycopy(bb, 0, bytes, l - n, n);
        return new String(bytes);
    }
}